﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Access;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Web.Utils;
using TicketsPhone.Domain.Utils;
using TicketsPhone.Entidades;

namespace TicketsPhone.Web.Controllers
{
    public class UsuariosController : BaseController, IConsultasSeccion<UsuarioFormModel>
    {

        UsuarioRepositorio _usuario = new UsuarioRepositorio();
        PerfilRepositorio _perfil = new PerfilRepositorio();
        EntidadRepositorio _entidad = new EntidadRepositorio();

        public TipoModulo ModuloActual
        {
            get { return TipoModulo.Usuarios; }
        }

        public ActionResult Listar()
        {
            UsuarioFormModel model = new UsuarioFormModel();
            List<Usuario> lista = new List<Usuario>();

            _usuario.Objeto = new Usuario();

            if (!string.IsNullOrEmpty(Request.QueryString["buscador"]))
            {    
                _usuario.Objeto.Email = Request.QueryString["buscador"];
            }

            model.CargarDatosPaginados(_usuario.Filtrar());

            return View(model);
        }

        public ActionResult Editar(int id)
        {
            UsuarioFormModel model = new UsuarioFormModel();
            model.Objeto = _usuario.Cargar(id);
            model.Perfiles = _perfil.ObtenerTodos();
            model.Entidades = _entidad.ObtenerTodos();
            model.Accion = TipoTransaccion.Editar;

            if (model.Objeto.IdUsuario.HasValue)
            {
                GuardarLogTransaccion(TipoTransaccion.Editar, model.Objeto);
                return View(model);
            }
            else
            {
                return RedirectToAction("Listar");
            }
        }


        [HttpPost]
        public ActionResult Editar(UsuarioFormModel model, int id)
        {
            if (ModelState.IsValid)
            {
                _usuario.Objeto = model.Objeto;
                _usuario.Objeto.IdUsuario = id;
                model.Accion = TipoTransaccion.Editar;

                if (model.CambiarClave)
                    _usuario.Objeto.Pass = Utilidades.Utilidades.MD5(model.Objeto.Pass);
                
                if (_usuario.Editar())
                {
                    model.Javascript = Scripts.RedireccionConMensaje("/Usuarios/Listar", "Usuario actualizado correctamente");
                }
                else
                {
                    model.Perfiles = _perfil.ObtenerTodos();
                    model.Entidades = _entidad.ObtenerTodos();

                    if (_usuario.TipoError == TipoErrorSql.Unique)
                        model.Javascript = Scripts.Alert("El correo ya ha sido asignado a un usuario. Intente de nuevo.");
                    else
                        model.Javascript = Scripts.Alert("El usuario no se pudo actualizar");
                }
            }

            return View(model);
        }

        public ActionResult Crear()
        {
            UsuarioFormModel model = new UsuarioFormModel();
            model.Accion = TipoTransaccion.Crear;
            model.Perfiles = _perfil.ObtenerTodos();
            model.Entidades = _entidad.ObtenerTodos();
            return View(model);
        }
        
        [HttpPost]
        public ActionResult Crear(UsuarioFormModel model)
        {
            if (ModelState.IsValid)
            {
                _usuario.Objeto = model.Objeto;
                _usuario.Objeto.EsAdministrador = true;
                int idUsuario = _usuario.Crear();                

                if (idUsuario > 0)
                {
                    model.Javascript = Scripts.RedireccionConMensaje("/Usuarios/Listar", "Usuario creado correctamente");
                }
                else
                {

                    GuardarLogTransaccion(TipoTransaccion.Crear, model.Objeto);
                    model.Perfiles = _perfil.ObtenerTodos();
                    model.Entidades = _entidad.ObtenerTodos();

                    if (_usuario.TipoError == TipoErrorSql.Unique)
                        model.Javascript = Scripts.Alert("El correo ya ha sido asignado a un usuario. Intente de nuevo.");
                    else
                        model.Javascript = Scripts.Alert("El usuario no se pudo crear");
                }
            }

            return View(model);
        }


        public ActionResult Eliminar(int id)
        {
            BaseModel model = new BaseModel();

            if (_usuario.Eliminar(id))
                model.Javascript = Scripts.RedireccionConMensaje("/Usuarios/Listar", "Usuario eliminado correctamente");
            else
                model.Javascript = Scripts.RedireccionConMensaje("/Usuarios/Listar", "El usuario no se pudo eliminar");

            return View(model);
        }
    }
}
